#include <iostream>
#include <mutex>
#include <thread>

using std::cout;
using std::endl;
using std::mutex;
using std::lock_guard;
using std::thread;

int gCnt = 0;
mutex mtx;//创建了互斥锁的对象

class MutexLockGuard
{
public:
    MutexLockGuard(mutex &mtx)
    : _mutex(mtx)
    {
        _mutex.lock();
    }

    ~MutexLockGuard()
    {
        _mutex.unlock();
    }
private:
    mutex &_mutex;
};

void threadFunc()
{
    for(size_t idx = 0; idx != 10000000; ++idx)
    {
        //lock_guard使用了C++之父提供出来的RAII的思想进行设计
        //在构造函数中进行上锁，在析构函数中进行解锁
        //RAII的本质：利用到了栈对象的生命周期管理资源
        //锁的粒度（也就是锁的范围）
        lock_guard<mutex> lg(mtx);
        ++gCnt;//对共享资源进行写操作的时候，要上锁
        //xxxxx
        //yyyy
        //zzzz
    }
}

int main(int argc, char *argv[])
{
    thread th1(threadFunc);
    thread th2(threadFunc);

    th1.join();
    th2.join();
    cout << "gCnt = " << gCnt << endl;

    return 0;
}

